/**********************************************
* Copyright (C) 2009 Lukas Laag
* This file is part of lib-gwt-svg-samples.
*
* libgwtsvg-samples is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* libgwtsvg-samples is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with libgwtsvg-samples. If not, see http://www.gnu.org/licenses/
**********************************************/
package org.vectomatic.svg.samples.client;
import org.vectomatic.dom.svg.utils.DOMHelper;
import org.vectomatic.dom.svg.utils.SVGConstants;
import org.vectomatic.svg.samples.client.dnd.DndSample;
import org.vectomatic.svg.samples.client.events.EventSample;
import org.vectomatic.svg.samples.client.features.FeaturesSample;
import org.vectomatic.svg.samples.client.parser.ParserSample;
import org.vectomatic.svg.samples.client.shapes.ShapesSample;
import org.vectomatic.svg.samples.client.smil.SmilSample;
import org.vectomatic.svg.samples.client.widgets.WidgetsSample;
import org.vectomatic.svg.samples.client.xpath.XPathSample;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.RootLayoutPanel;
import com.google.gwt.user.client.ui.SplitLayoutPanel;
import com.google.gwt.user.client.ui.Tree;
import com.google.gwt.user.client.ui.TreeItem;
import com.google.gwt.user.client.ui.Widget;
/**
* Application main class. Creates the base UI structure and sets up
* individual samples
* @author laaglu
*/
public class Main implements EntryPoint {
/**
* UiBinder template interface
*/
interface MainBinder extends UiBinder<SplitLayoutPanel, Main> {
}
private static MainBinder binder = GWT.create(MainBinder.class);
/**
* The type passed into the
* {@link org.vectomatic.svg.samples.generator.SourceGenerator}.
*/
private static final class GeneratorInfo {
}
/**
* Client bundle interface
*/
public interface MainBundle extends ClientBundle {
@Source("orgball.gif")
public ImageResource treeItem();
@Source("main.css")
public MainCss css();
}
/**
* CSS interface
*/
public interface MainCss extends CssResource {
/**
* style of tab items
*/
public String tab();
/**
* style of sample container
*/
public String sample();
}
/**
* The mai resource bundle
*/
public static MainBundle mainBundle = GWT.create(MainBundle.class);
/**
* The sample navigation tree
*/
@UiField
Tree tree;
/**
* The split panel
*/
@UiField
SplitLayoutPanel splitPanel;
/**
* A LayoutPanel which acts as a card layout (it has several
* child widgets, but only one is visible at a given time).
*/
@UiField
LayoutPanel sampleContainer;
@Override
public void onModuleLoad() {
GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
public void onUncaughtException(Throwable throwable) {
String text = "Uncaught exception: ";
while (throwable != null) {
StackTraceElement[] stackTraceElements = throwable
.getStackTrace();
text += throwable.toString() + "\n";
for (int i = 0; i < stackTraceElements.length; i++) {
text += " at " + stackTraceElements[i] + "\n";
}
throwable = throwable.getCause();
if (throwable != null) {
text += "Caused by: ";
}
}
DialogBox dialogBox = new DialogBox(true);
DOM.setStyleAttribute(dialogBox.getElement(), "backgroundColor", "#ABCDEF");
System.err.print(text);
text = text.replaceAll(" ", " ");
dialogBox.setHTML("<pre>" + text + "</pre>");
dialogBox.center();
}
});
mainBundle.css().ensureInjected();
// Generate the source code for the examples
GWT.create(GeneratorInfo.class);
SplitLayoutPanel panel = binder.createAndBindUi(this);
// Populate the sample tree
TreeItem shapesSample = tree.addItem(SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(mainBundle.treeItem()).getHTML() + " shapes"));
shapesSample.setUserObject(new ShapesSample());
TreeItem eventSample = tree.addItem(SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(mainBundle.treeItem()).getHTML() + " events"));
eventSample.setUserObject(new EventSample());
TreeItem parserSample = tree.addItem(SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(mainBundle.treeItem()).getHTML() + " parser"));
parserSample.setUserObject(new ParserSample());
TreeItem featuresSample = tree.addItem(SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(mainBundle.treeItem()).getHTML() + " features"));
featuresSample.setUserObject(new FeaturesSample());
TreeItem widgetsSample = tree.addItem(SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(mainBundle.treeItem()).getHTML() + " widgets"));
widgetsSample.setUserObject(new WidgetsSample());
TreeItem smilSample = tree.addItem(SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(mainBundle.treeItem()).getHTML() + " SMIL animation"));
smilSample.setUserObject(new SmilSample());
TreeItem xpathSample = tree.addItem(SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(mainBundle.treeItem()).getHTML() + " XPath"));
xpathSample.setUserObject(new XPathSample());
if (DOMHelper.hasFeature(SVGConstants.SVG_FEATURE_DND_EVENTS)) {
TreeItem dndSample = tree.addItem(SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(mainBundle.treeItem()).getHTML() + " Drag-and-Drop"));
dndSample.setUserObject(new DndSample());
}
TreeItem about = tree.addItem(SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(mainBundle.treeItem()).getHTML() + " about"));
about.setUserObject(new AboutSample());
tree.addSelectionHandler(new SelectionHandler<TreeItem>() {
@Override
public void onSelection(SelectionEvent<TreeItem> event) {
SampleBase currentSample = (SampleBase) event.getSelectedItem().getUserObject();
selectSample(currentSample.getPanel());
}
});
tree.setSelectedItem(shapesSample);
RootLayoutPanel.get().add(panel);
}
/**
* If it is not already a child of the layoutPanel,
* adds this sample panel to children of the layoutPanel. Make all other children
* hidden except this this sample panel.
*/
private void selectSample(Widget samplePanel) {
int count = sampleContainer.getWidgetCount();
int index = -1;
for (int i = 0; i < count; i++) {
Widget w = sampleContainer.getWidget(i);
if (w != samplePanel) {
sampleContainer.setWidgetVisible(w, false);
} else {
sampleContainer.setWidgetVisible(w, true);
index = i;
}
}
if (index == -1) {
sampleContainer.add(samplePanel);
sampleContainer.setWidgetVisible(samplePanel, true);
}
}
}